const { ESLint } = require('eslint');
const { glob } = require('glob');
const path = require('path');
const chalk = require('chalk');

// ESLint错误消息的中文映射
const errorMessageMap = {
  // 基础规则
  'no-console': '不允许使用console',
  'no-debugger': '不允许使用debugger',
  'no-cond-assign': '不允许在条件语句中进行赋值操作',
  'no-constant-condition': '条件语句中不允许使用常量表达式',
  'use-isnan': '请使用isNaN()函数来比较NaN',
  'eqeqeq': '请使用严格相等运算符(===)而不是相等运算符(==)',
  'no-var': '请使用let或const代替var',
  'prefer-const': '建议使用const声明不会被重新赋值的变量',
  'no-undef': '使用了未定义的变量',
  'no-unused-vars': '存在未使用的变量',
  'max-len': '代码行长度超过限制',
  'complexity': '函数的复杂度超过限制',
  'camelcase': '变量名应使用驼峰命名法',

  // Vue 3 规则
  'vue/multi-word-component-names': '组件名称必须是多个单词组成',
  'vue/require-default-prop': 'prop必须有默认值',
  'vue/require-prop-types': 'prop必须指定类型',
  'vue/require-explicit-emits': '必须显式声明emit事件',
  'vue/no-unused-components': '存在未使用的组件',
  'vue/no-unused-vars': '存在未使用的变量',
  'vue/no-mutating-props': '不允许直接修改props',
  'vue/no-side-effects-in-computed-properties': '计算属性中不允许有副作用',
  'vue/return-in-computed-property': '计算属性必须返回一个值',
  'vue/valid-template-root': 'Vue模板必须有一个根元素',
  'vue/valid-v-model': 'v-model指令使用无效',
  'vue/valid-v-on': 'v-on指令使用无效',
  'vue/valid-v-if': 'v-if指令使用无效',
  'vue/valid-v-for': 'v-for指令使用无效',
  'vue/require-v-for-key': 'v-for指令必须使用key属性',

  // 代码风格规则
  'vue/html-self-closing': '自闭合标签格式不正确',
  'vue/component-definition-name-casing': '组件定义名称必须使用PascalCase',
  'vue/prop-name-casing': 'prop名称必须使用camelCase',
  'vue/v-bind-style': 'v-bind指令应使用简写形式',
  'vue/v-on-style': 'v-on指令应使用简写形式',
  'vue/order-in-components': '组件选项的顺序不正确',

  // 其他规则
  'semi': '语句末尾缺少分号',
  'no-unreachable': '存在无法访问的代码',
  'no-empty': '不允许空的代码块',
  'no-empty-function': '不允许空函数',
  'quotes': '字符串引号使用不正确',
  'no-mixed-spaces-and-tabs': '不允许混用空格和制表符',
  'no-irregular-whitespace': '存在不规则的空白字符',
  'no-trailing-spaces': '行尾存在多余的空格',
  'no-multiple-empty-lines': '存在过多的空行'
};

async function lintFiles(pattern) {
  try {
    // 初始化ESLint
    const eslint = new ESLint({
      useEslintrc: true,
      extensions: [".vue"],
      cwd: __dirname,
      resolvePluginsRelativeTo: __dirname,
      overrideConfigFile: path.join(__dirname, '.eslintrc.js')
    });

    // 获取所有匹配的文件
    const files = await glob(pattern, {
      absolute: true,
      followSymbolicLinks: false,
      ignore: ['**/node_modules/**']
    });
    
    if (files.length === 0) {
      return {
        success: true,
        results: [],
        errorCount: 0,
        warningCount: 0
      };
    }

    // 执行lint
    const results = await eslint.lintFiles(files);
    
    // 转换错误消息为中文
    const localizedResults = results.map(result => ({
      ...result,
      messages: result.messages.map(msg => ({
        ...msg,
        message: errorMessageMap[msg.ruleId] || msg.message
      }))
    }));

    // 统计错误和警告
    const errorCount = localizedResults.reduce((sum, result) => sum + result.errorCount, 0);
    const warningCount = localizedResults.reduce((sum, result) => sum + result.warningCount, 0);

    return {
      success: true,
      results: localizedResults,
      errorCount,
      warningCount
    };

  } catch (error) {
    throw error;
  }
}

// 导出lintFiles函数
module.exports = { lintFiles };

// 如果直接运行此文件
if (require.main === module) {
  const pattern = process.argv[2] || '**/*.vue';
  lintFiles(pattern).then(result => {
    if (result.success) {
      console.log('\n检查结果：');
      console.log(`总计: ${result.errorCount} 个错误, ${result.warningCount} 个警告\n`);
      
      result.results.forEach(fileResult => {
        console.log(`文件: ${fileResult.filePath}`);
        fileResult.messages.forEach(msg => {
          const type = msg.severity === 2 ? chalk.red('错误') : chalk.yellow('警告');
          console.log(`${type} ${msg.line}:${msg.column} - ${msg.message} [${msg.ruleId}]`);
        });
        console.log('');
      });
    } else {
      console.error('检查失败：', result.error);
    }
  }).catch(error => {
    console.error('执行检查时发生错误：', error);
  });
}